from cairosvg import svg2png
from PIL import Image
import numpy as np
import io



"""

使用 svg 格式图片做遮罩

cairosvg 库安装较繁，非必要不建议使用 svg 图片做遮罩，可避免 import 该文件；
建议优先搜索自己系统、cpu架构的安装文档，或参考：
Mac M2安装步骤（作参考）：

1-完全清理并重装 Cairo（关键步骤）
    # 完全卸载现有 Cairo
    brew uninstall --ignore-dependencies cairo
    brew uninstall --ignore-dependencies cairocffi

    # 重新安装并强制链接
    brew install cairo
    brew link --overwrite cairo

    # 检查安装路径
    ls -l /opt/homebrew/lib/libcairo*
    
2-设置动态库路径（永久生效）
    # 添加到 shell 配置文件 (~/.zshrc 或 ~/.bashrc)
    echo 'export DYLD_FALLBACK_LIBRARY_PATH="/opt/homebrew/lib:$DYLD_FALLBACK_LIBRARY_PATH"' >> ~/.zshrc
    echo 'export PKG_CONFIG_PATH="/opt/homebrew/lib/pkgconfig:$PKG_CONFIG_PATH"' >> ~/.zshrc
    source ~/.zshrc


1-（非必要）重新创建环境（推荐原生 ARM 架构）
    # 创建原生 ARM 架构环境（M1/M2 Mac 最佳性能）
    CONDA_SUBDIR=osx-arm64 conda create -n py310_arm python=3.10
    # 激活新环境
    conda activate py310_arm
    # 永久设置该环境为 ARM 架构
    conda env config vars set CONDA_SUBDIR=osx-arm64

2-安装必要依赖（ARM 架构）
    # 通过 conda-forge 安装（确保架构兼容）
    conda install -c conda-forge cairo cairocffi cairosvg
    # 验证安装
    python -c "import cairosvg; print('CairoSVG 安装成功！')"
    
    
"""



def svg_to_mask(svg_path, width=4000):
    # 直接使用 cairosvg 转换为 PNG
    png_data = svg2png(url=svg_path, output_width=width)
    
    # 转换为 NumPy 数组
    img = Image.open(io.BytesIO(png_data))
    mask = np.array(img)
    
    # 提取 Alpha 通道作为蒙版
    if mask.ndim == 3 and mask.shape[2] == 4:
        # 1. 提取 Alpha 通道并二值化 (0/255)
        alpha = (mask[:, :, 3] > 0).astype(np.uint8) * 255  # 现在变为2维数组
        # 反转蒙版:255->1，0->255，1->0
        # 写法一：数学运算（推荐）
        inverted_mask = 255 - alpha
        
        # 写法二：条件判断
        # inverted_mask = np.where(alpha > 0, 0, 255).astype(np.uint8)
        
        # 写法三：布尔运算
        # inverted_mask = (~alpha.astype(bool)).astype(np.uint8) * 255

        # 3. 确保输出为 2D 数组 (H,W)
        final_mask = inverted_mask
    return final_mask


def svg_to_ndarray(svg_path, width=4000):
    # 直接使用 cairosvg 转换为 PNG
    png_data = svg2png(url=svg_path, output_width=width)
    
    # 转换为 NumPy 数组
    img = Image.open(io.BytesIO(png_data))
    mask = np.array(img)
    return mask

